package fr.chrysalis.utils
{
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	
	/**
	 * Class de surcharge du trace 
	 * 
	 */
	public class Debug
	{
		
		// lvl 5 -> Affichage des chargements de l'instance xml et sprite
		// lvl 10 -> Affichage liées à la connexion au serveur
		// lvl 20 -> Affichage Réception des notifications dans la view
		// lvl 40 -> Affichage des déplacements
		
		// TODO
		// Remplacement le niveau de debug par des constantes de type de debug
		
		public static var DEBUG_LEVEL:int = 50; 
		
		/**
		 * Surcharge le trace pour typer les éléments 
		 * @param arg Element à tracer (texte, variable, objet...)
		 * @param debugLvl Optionnel
		 * 
		 */
		public static function dump(arg:*, debugLvl:int = 10):void{
			
			if(Debug.DEBUG_LEVEL > debugLvl){
				var type:String = getQualifiedClassName(arg);
				switch (type) {
					case 'String' || 'int' || 'Boolean' || 'Number' || 'uint' :
						trace(Debug.display(arg));
						break;
					default:
						trace('Type : ' + type + ' ' + Debug.display(arg));
						break;
				}
			}
			
		}
		
		private static function display(arg:*):String{
			var type:String = getQualifiedClassName(arg);
			if(type.indexOf('Vector') != -1){
				type = 'Vector';
			}
			var rtrn:String = '';
			
			var nb:int;
			var i:int;
			
			switch (type) {
				case 'Array':
					nb = arg.length;
					for(i=0; i<nb; i++){
						rtrn += "\n ----> Key["+i+"] = " + Debug.display(arg[i]);
					}
					break;
				case 'flash.utils::Dictionary':
					var index:*;
					for (index in arg) {
						rtrn += "\n ----> Key["+index+"] = " + Debug.display(arg[index]);
					}
					break;
				case 'Vector':
					nb = arg.length;
					for(i=0; i<nb; i++){
						rtrn += "\n ----> Key["+i+"] = " + Debug.display(arg[i]);
					}
					break;
				case 'null':
					rtrn += 'NULL';
					break;
				default:
					try{
						rtrn += arg.toString();
					}catch(e:Error){
						rtrn += e.message;
					}
					break;
			}
			
			return rtrn;
		}
		
	}
}